www.gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/precoding.m

    function precodedSymb = precoding(layerSymb,preProcess,transMod,nTx,PMI,M_0_SYMB)
% 预编码 完成复值符号到天线端口的映射过程
% 包含单天线预编码 传输分集和空间复用预编码
% 输入:layerSymb:层上符号
%       preProcess:预处理方式
%       transMod:传输模式
%       nTx:发端天线数
%       PMI:预编码码本序号
%       M_0_SYMB:码字0上的复值符号数
% 输出:
%       precodedSymb:经过预编码的符号
%  Author:		程式小组(徐萌 张妙 张晓庆)
%  Date:		2010-07-11
%  ==========================================================

load CodeBook %载入预编码码本 W_SM_2Tx(2天线码本)和W_SM_4Tx(4天线码本)

if strcmp(preProcess,'singleAnt')
    
    precodedSymb = layerSymb;
    
elseif strcmp(preProcess,'spatialMultiplexing')
    
    if transMod == 3
        % 大时延CDD
        
        [nLayer,len] = size(layerSymb);
        precodedSymb = zeros(nTx,len); 
        if nTx == 2
            
            PMI = 1+(nLayer-1)*2^nTx; % 使用固定预编码
            W = W_SM_2Tx(:,1:nLayer,PMI);
            U = 1/sqrt(2)*[1 1;1 exp(-1i*2*pi/2)];
            for iSymb = 1:len
                D = [1 0;0 exp(-1i*2*pi*iSymb/2)];
                precodedSymb(:,iSymb) = W*D*U*layerSymb(:,iSymb);
            end
            
        elseif nTx == 4
            PMIgroup = [13 14 15 16]+(nLayer-1)*2^nTx; % 使用16个预编码码字中指定4个
            
            if nLayer == 2
                U = 1/sqrt(2)*[1 1;1 exp(-1i*2*pi/2)];
            elseif nLayer == 3
                U = 1/sqrt(3)*[1 1 1;
                    1 exp(-1i*2*pi/3) exp(-1i*4*pi/3);
                    1 exp(-1i*4*pi/3) exp(-1i*8*pi/3)];
            elseif nLayer == 4
                U = 1/sqrt(4)*[1 1 1 1;
                    1 exp(-1i*2*pi/4) exp(-1i*4*pi/4) exp(-1i*6*pi/4);
                    1 exp(-1i*4*pi/4) exp(-1i*8*pi/4) exp(-1i*12*pi/4);
                    1 exp(-1i*6*pi/4) exp(-1i*12*pi/4) exp(-1i*18*pi/4)];
            end
            
            for iSymb = 1:len
               k = mod((iSymb-1)/nLayer,4)+1;
               W = W_SM_4Tx(:,1:nLayer,PMIgroup(k));
               
               if nLayer == 2
                   D = [1 0;0 exp(-1i*2*pi*iSymb/2)];
               elseif nLayer == 3
                   D = [1 0 0;
                       0 exp(-1i*2*pi*iSymb/3) 0;
                       0 0 exp(-1i*4*pi*iSymb/3)];
               elseif nLayer == 4
                   D = [1 0 0 0;
                       0 exp(-1i*2*pi*iSymb/4) 0 0;
                       0 0 exp(-1i*4*pi*iSymb/4) 0;
                       0 0 0 exp(-1i*6*pi*iSymb/4)];
               end
               precodedSymb = W*D*U*layerSymb(:,iSymb);
            end
            
        end % end if 天线选择
        
    else
        nLayer = size(layerSymb,1);
        
        if nTx == 2
            
            % 2天线端口配置,空间复用的码本大小:2*2*8  W_SM_2Tx
            % 4天线端口配置,空间复用的码本大小:4*4*64 W_SM_4Tx
            % 码本使用举例 W_SM_4Tx(:,1:3,33) 第一维表示天线数 第二维表示层数 第三维表示属于层3的第2个码字
            PMI = PMI+1+(nLayer-1)*2^nTx;
            W = W_SM_2Tx(:,1:nLayer,PMI);
            precodedSymb = W*layerSymb;
            
        elseif nTx == 4
            
            % 2天线端口配置,空间复用的码本大小:2*2*8  W_SM_2Tx
            % 4天线端口配置,空间复用的码本大小:4*4*64 W_SM_4Tx
            % 码本使用举例 W_SM_4Tx(:,1:3,33) 第一维表示天线数 第二维表示层数 第三维表示属于层3的第2个码字
            PMI = PMI+1+(nLayer-1)*2^nTx;
            W = W_SM_4Tx(:,1:nLayer,PMI);
            precodedSymb = W*layerSymb;
            
        end % end if 天线选择
        
    end % end if 大时延CDD和零时延选择
    
    
elseif strcmp(preProcess,'tranmitDiversity')
    
    if nTx == 2
        W_TD_2Tx = 1/sqrt(2)*[1 0 1i 0;0 -1 0 1i;0 1 0 1i;1 0 -1i 0];
        len = length(layerSymb); % 每层符号数
        precodedSymb = zeros(2,len*2); % 存储经过预编码的符号
        transSymb = [real(layerSymb(1,:));real(layerSymb(2,:));imag(layerSymb(1,:));imag(layerSymb(2,:))];
        transPort = W_TD_2Tx*transSymb;
        precodedSymb(1,1:2:end-1) = transPort(1,:);
        precodedSymb(1,2:2:end-0) = transPort(3,:);
        precodedSymb(2,1:2:end-1) = transPort(2,:);
        precodedSymb(2,2:2:end-0) = transPort(4,:);
        
    elseif nTx == 4
        W_TD_4Tx=1/sqrt(2)*[1 0 0 0 1i 0 0 0;0 0 0 0 0 0 0 0;0 -1 0 0 0 1i 0 0;0 0 0 0 0 0 0 0;
            0 1 0 0 0 1i 0 0;0 0 0 0 0 0 0 0;1 0 0 0 -1i 0 0 0;0 0 0 0 0 0 0 0;
            0 0 0 0 0 0 0 0;0 0 1 0 0 0 1i 0;0 0 0 0 0 0 0 0;0 0 0 -1 0 0 0 1i;
            0 0 0 0 0 0 0 0;0 0 0 1 0 0 0 1i;0 0 0 0 0 0 0 0;0 0 1 0 0 0 -1i 0];
        len = length(layerSymb); % 每层符号数
        precodedSymb = zeros(4,len*4); % 存储经过预编码的符号
        
        transSymb=[real(layerSymb(1,:));real(layerSymb(2,:));real(layerSymb(3,:));real(layerSymb(4,:));
            imag(layerSymb(1,:));imag(layerSymb(2,:));imag(layerSymb(3,:));imag(layerSymb(4,:))];
        transPort = W_TD_4Tx*transSymb;
        
        precodedSymb(1,1:4:end-3) = transPort(1,:);
        precodedSymb(1,2:4:end-2) = transPort(5,:);
        precodedSymb(1,3:4:end-1) = transPort(9,:);
        precodedSymb(1,4:4:end-0) = transPort(13,:);
        
        precodedSymb(2,1:4:end-3) = transPort(2,:);
        precodedSymb(2,2:4:end-2) = transPort(6,:);
        precodedSymb(2,3:4:end-1) = transPort(10,:);
        precodedSymb(2,4:4:end-0) = transPort(14,:);
        
        precodedSymb(3,1:4:end-3) = transPort(3,:);
        precodedSymb(3,2:4:end-2) = transPort(7,:);
        precodedSymb(3,3:4:end-1) = transPort(11,:);
        precodedSymb(3,4:4:end-0) = transPort(15,:);
        
        precodedSymb(4,1:4:end-3) = transPort(4,:);
        precodedSymb(4,2:4:end-2) = transPort(8,:);
        precodedSymb(4,3:4:end-1) = transPort(12,:);
        precodedSymb(4,4:4:end-0) = transPort(16,:);
        
        
        % 如果分集方式中,码字上复值符号数不是4的整数倍,则尾部添加的2两个填充要在此处删掉
        if mod(M_0_SYMB,4) ~= 0
            precodedSymb(:,end-1:end) = [];
        end
        
    end
    
    
end